#ifndef _FILE_H_
#define _FILE_H_


#define F_OK 0
#define F_ERROR -1
#define F_EOF -2

//---------------------------------------------------------------------------
// CLASS: File
// DESCRIPTION: Encapsula la logica de manejo de archivos binarios
//---------------------------------------------------------------------------

class File
{
	private:
		//--------------------------------------------------------------
		//	ATTRIBUTE: filename
		//	DESCRIPTION: representa el nombre del archivo
		//--------------------------------------------------------------
		char* filename;

		//--------------------------------------------------------------
		//	ATTRIBUTE: handler
		//	DESCRIPTION: descriptor de archivo
		//--------------------------------------------------------------
		int handler;

		//--------------------------------------------------------------
		//	ATTRIBUTE: status
		//	DESCRIPTION: status del archivo representado por el handler
		//--------------------------------------------------------------
		int status;


		//--------------------------------------------------------------
		//	ATTRIBUTE: offsetBuffer
		//	DESCRIPTION: offset del proximo registro a leer en el Buffer
		//		     Usado por el metodo read y unico para cada instancia
		//--------------------------------------------------------------
		//int offsetBuffer;
	public:
		//--------------------------------------------------------------
		//	METHOD: File
		//	DESCRIPTION: constructor de la clase
		//--------------------------------------------------------------
		File();

		//--------------------------------------------------------------
		//	METHOD: ~File
		//	DESCRIPTION: destructor de la clase
		//--------------------------------------------------------------
		~File();

		//--------------------------------------------------------------
		//	METHOD: open
		//	DESCRIPTION: abre el archivo para lectura-escritura,
		//			sino existiera lo crea.
		//--------------------------------------------------------------
		int open(const char* nombre);

		//--------------------------------------------------------------
		//	METHOD: close
		//	DESCRIPTION: cierra el archivo
		//--------------------------------------------------------------
		int close();

		//--------------------------------------------------------------
		//	METHOD: write
		//	DESCRIPTION: escribe en el archivo el stream de bytes ptr
		//			de longitud size
		//--------------------------------------------------------------
		int write(void* ptr, unsigned int size);

		//--------------------------------------------------------------
		//	METHOD: read
		//	DESCRIPTION: lee del archivo size bytes dejandolo en el 
		//			stream de bytes ptr.
		//--------------------------------------------------------------
		int read(void* ptr, unsigned int size);
		//--------------------------------------------------------------
		//	METHOD: read
		//	DESCRIPTION: lee del archivo size bytes desde el offset dejandolo en el 
		//			stream de bytes ptr.
		//--------------------------------------------------------------
		int read(void* ptr, unsigned int size, int offset);

		//--------------------------------------------------------------
		//	METHOD: getCurrentPos
		//	DESCRIPTION: devuelve la posicion actual en el archivo
		//--------------------------------------------------------------
		int getCurrentPos();

		//--------------------------------------------------------------
		//	METHOD: setCurrentPos
		//	DESCRIPTION: establece la posicion dentro del archivo a
		//			partir del inicio.
		//--------------------------------------------------------------
		int setCurrentPos(int offset);

		//--------------------------------------------------------------
		//	METHOD: getSize
		//	DESCRIPTION: devuelve el tamaño en bytes del arhivo name.
		//--------------------------------------------------------------
		int getSize(char* name);

		//--------------------------------------------------------------
		//	METHOD: exists
		//	DESCRIPTION: determina si existe o no el archivo name
		//--------------------------------------------------------------
		bool exists(char *name);

		//--------------------------------------------------------------
		//	METHOD: eraseFile
		//	DESCRIPTION: elimina el archivo name
		//--------------------------------------------------------------
		void eraseFile(char *name);
	
};

#endif


